/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bddfirstproject.controller;

import bddfirstproject.AccesBD;
import bddfirstproject.model.Auteur;
import bddfirstproject.model.PartieRedaction;
import bddfirstproject.model.Theme;
import java.io.IOException;
import java.lang.reflect.Array;
import java.sql.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.jdbc.OracleTypes;

/**
 *
 * @author epulapp
 */
public class PartieRedactionDAL {

    
    public PartieRedactionDAL() {
    }
    
    
    //--------------------------------------------------------------------------
    //Ajouter une rédaction a la base de données
    //--------------------------------------------------------------------------
    public void ajouterRedaction(Auteur auteur, Theme theme, PartieRedaction partieRedac) {
        
        int idAuteur   = auteur.getIdAuteur();
        int idTheme    = theme.getIdTheme();
        String titre   = partieRedac.getTitrePartie();
        String contenu = partieRedac.getContenuPartie();

        try {
           
            AccesBD connect = new AccesBD();
            //Connexion à la base
            connect.openConnection();

            //On appelle la procédure stockée osus ORACLE NOUVEL_AUTEUR
            CallableStatement redactionInsert = connect.getConnect().prepareCall("{ call NOUVELLE_REDACTION(?, ?, ?, ?) }");           
            redactionInsert.setInt(1,idAuteur);
            redactionInsert.setInt(2,idTheme);
            redactionInsert.setString(3,titre);
            redactionInsert.setString(4,contenu);
            redactionInsert.execute();        
            connect.getConnect().commit();       
            System.out.println("La rédaction a été inséré dans la base ORACLE");    

            //Fermeture de la connexion
            connect.closeConnection();
            
        } 
        catch (IOException e1) {
            System.out.println("Erreur d'accès à la base " + e1);
        }
        catch (java.sql.SQLException e2) {
            System.out.println("Erreur lors de l'exécution de la requête " + e2);
        }
        catch (Exception e3) {
            System.out.println("Une erreur a été rencontrée " + e3);
        }
    }
    
    
    //--------------------------------------------------------------------------
    //Ajouter une sous partie de rédaction a la base de données
    //--------------------------------------------------------------------------
    public void ajouterSousPartieRedaction(Auteur auteur, int idRedactionParente, PartieRedaction partieRedac) {
        
        int idAuteur   = auteur.getIdAuteur();
        String titre   = partieRedac.getTitrePartie();
        String contenu = partieRedac.getContenuPartie();

        try {
           
            AccesBD connect = new AccesBD();
            //Connexion à la base
            connect.openConnection();

            //On appelle la procédure stockée osus ORACLE NOUVEL_AUTEUR
            CallableStatement redactionInsert = connect.getConnect().prepareCall("{ call NOUVELLE_SOUS_PARTIE(?, ?, ?, ?) }");           
            redactionInsert.setInt(1,idAuteur);
            redactionInsert.setInt(2,idRedactionParente);
            redactionInsert.setString(3,titre);
            redactionInsert.setString(4,contenu);
            redactionInsert.execute();        
            connect.getConnect().commit();       
            System.out.println("La sous-partie a été inséré dans la base ORACLE");    

            //Fermeture de la connexion
            connect.closeConnection();
            
        } 
        catch (IOException e1) {
            System.out.println("Erreur d'accès à la base " + e1);
        }
        catch (java.sql.SQLException e2) {
            System.out.println("Erreur lors de l'exécution de la requête " + e2);
        }
        catch (Exception e3) {
            System.out.println("Une erreur a été rencontrée " + e3);
        }
    }
    
    
    //--------------------------------------------------------------------------
    //Archivage d'un seul article
    //--------------------------------------------------------------------------
    public void archivagePartieRedaction(int idAuteur, int idPartieRedac) {

        try {
           
            AccesBD connect = new AccesBD();
            //Connexion à la base
            connect.openConnection();

            //On appelle la procédure stockée osus ORACLE NOUVEL_AUTEUR
            CallableStatement redactionInsert = connect.getConnect().prepareCall("{ call ARCHIVAGE(?, ?) }");           
            redactionInsert.setInt(1,idAuteur);
            redactionInsert.setInt(2,idPartieRedac);
            redactionInsert.execute();        
            connect.getConnect().commit();       
            System.out.println("La partie sélectionnée a été archivée");    

            //Fermeture de la connexion
            connect.closeConnection();
            
        } 
        catch (IOException e1) {
            System.out.println("Erreur d'accès à la base " + e1);
        }
        catch (java.sql.SQLException e2) {
            System.out.println("Erreur lors de l'exécution de la requête " + e2);
        }
        catch (Exception e3) {
            System.out.println("Une erreur a été rencontrée " + e3);
        }
    }
    
    
    //--------------------------------------------------------------------------
    //Archivage d'un thème de rédaction
    //--------------------------------------------------------------------------
    public static void archivageArticleRedaction(int idAuteur, int idPartieRedac) throws SQLException {

        try {
           
            AccesBD connect = new AccesBD();
            //Connexion à la base
            connect.openConnection();

            //On appelle la procédure stockée osus ORACLE NOUVEL_AUTEUR
            CallableStatement redactionInsert = connect.getConnect().prepareCall("{ call ARCHIVAGE_ARTICLE(?, ?) }");           
            redactionInsert.setInt(1,idAuteur);
            redactionInsert.setInt(2,idPartieRedac);
            redactionInsert.execute();        
            connect.getConnect().commit();       
            System.out.println("La partie sélectionnée a été archivée");    

            //Fermeture de la connexion
            connect.closeConnection();
            
        } catch (IOException e1) {
            System.out.println("Erreur d'accès à la base " + e1);
        }
    }
    
    
    //--------------------------------------------------------------------------
    //Récupérer la liste de tous les articles
    //--------------------------------------------------------------------------
    public static ArrayList<PartieRedaction> getAllArticle(Theme theme) {
        
        ArrayList<PartieRedaction> listeArticle = new ArrayList<PartieRedaction>();

        try {
            
            AccesBD connect = new AccesBD();
            //Connexion à la base
            connect.openConnection();
            
            //Requête à exécuter
            PreparedStatement requete   = connect.getConnect().prepareStatement("SELECT id_partie, id_auteur, id_theme, inclus_dans, titre, contenu, archivage FROM PARTIE_REDACTION where inclus_dans IS null AND id_theme = ?");
            requete.setInt(1, theme.getIdTheme());
            ResultSet res               = requete.executeQuery();
            
            //Parcours des résultats
            while (res.next()) {
                int inclus_dans = res.getInt(4);
                if(res.wasNull()) {
                    inclus_dans = -1;
                }
                listeArticle.add(new PartieRedaction(res.getInt(1), res.getInt(2), res.getInt(3), inclus_dans, res.getString(5), res.getString(6), res.getBoolean(7)));
            }
            //Fermeture des resultsets
            res.close();
            requete.close();      
            
            //Fermeture de la connexion
            connect.closeConnection();
        } catch (IOException e1) {
            System.out.println("Erreur d'accès à la base " + e1);
        } catch (java.sql.SQLException e2) {
            System.out.println("Erreur lors de l'exécution de la requête " + e2);
        } catch (Exception e3) {
            System.out.println("Une erreur a été rencontrée " + e3);
        }
        
        return (listeArticle);
    }
    
    
    
    //--------------------------------------------------------------------------
    //Récupération de toutes les parties d'un articles (toute l'arborescence)
    //--------------------------------------------------------------------------
    public static ArrayList<PartieRedaction> getAllSousPartiesArticle(int idPartie) {
        
        ArrayList<PartieRedaction> listeParties = new ArrayList<PartieRedaction>();
        
        try {
           
            AccesBD connect = new AccesBD();
            //Connexion à la base
            connect.openConnection();
            
            String query = "begin ? := F_AFFICHAGE_ARTICLE(?); end;";

            CallableStatement stmt = connect.getConnect().prepareCall(query);

            // Declaration du paramètre retourné comme un curseur oracle
            stmt.registerOutParameter(1, OracleTypes.CURSOR);

            // Position du paramètre de la fonction
            stmt.setInt(2, idPartie);

            // Exécution et exploitation du résultat
            stmt.execute();
            ResultSet rs = (ResultSet)stmt.getObject(1);

            while (rs.next()) {
                int inclus_dans = rs.getInt(4);
                if(rs.wasNull()) {
                    inclus_dans = -1;
                }
                listeParties.add(new PartieRedaction(rs.getInt(1), rs.getInt(2), rs.getInt(3), inclus_dans, rs.getString(5), rs.getString(6), rs.getBoolean(7)));
            }
            
            rs.close();
            
            //Fermeture de la connexion
            connect.closeConnection();
            
        } 
        catch (IOException e1) {
            System.out.println("Erreur d'accès à la base " + e1);
        }
        catch (java.sql.SQLException e2) {
            System.out.println("Erreur lors de l'exécution de la requête " + e2);
        }
        catch (Exception e3) {
            System.out.println("Une erreur a été rencontrée " + e3);
        }
        
        return (listeParties);
    }
    
    public static void updatePartieRedaction(PartieRedaction partie) {
        try {
            AccesBD connect = new AccesBD();
            //Connexion à la base
            connect.openConnection();

            //Requête à exécuter
            String query = "UPDATE PARTIE_REDACTION SET titre = ?, contenu = ? WHERE id_partie = ?";
            PreparedStatement requete   = connect.getConnect().prepareStatement(query);
            requete.setString(1, partie.getTitrePartie());
            requete.setString(2, partie.getContenuPartie());
            requete.setInt(3, partie.getIdPartie());
            requete.executeQuery();
        } catch (IOException e1) {
            System.out.println("Erreur d'accès à la base " + e1);
        } catch (java.sql.SQLException e2) {
            System.out.println("Erreur lors de l'exécution de la requête " + e2);
        }
    }   
    
}
